#pragma once

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include<unistd.h>
#include<math.h>

#define N 20
#define S 5
#define I 6 //用于创建用户时进行密码初始化

typedef struct
{
    char name[N],
         password[N],
         sex[S];
    int id,
        age;
}member; //成员信息

typedef struct memNode
{
    member mem;
    struct memNode * next;
}memNode; //成员节点

#define SIZE_MEM sizeof(memNode)

enum
{
    login_num=1, admin_num, user_num, stu_num
};

extern char name_login[N],
            id_login[N],
            passwd_login[N],
            name_delete[N];
        int mistack; //用于判断输入错误密码次数

//用于获取文件的行数，一行一个用户，即获取用户总数
int getLine(const char *);

//用于选择相应用户的操作
void function(int);

//用于显示相应用户的操作菜单
void _menu(int);

//用于用户登入
int login(const char *);

//用于查询指定对象 admin_num是管理员查询操作 stu_num是普通用户查询操作
int inquire(int);

//用于查询学生
int _inquireStu(void);

//用于查询用户
int _inquireAdmin(void);

/*
    用途:用于将整型数据转换成数组的形式
    参数:
        int  待进行转换的整型数据
        char *  存储转互换后
        const int  要转化的进制
    无返回值
 */
void _itoa(int , char *, const int);

void headAdd(memNode* * p, memNode * newP); //头插

void tailAdd(memNode* * p,memNode * newP); //尾插

//从已有数据生成成员节点
memNode * getNode(member, int);

//找到成员节点
memNode * findNode(memNode *, int);

//创建成员节点
memNode * createNode(int num);

//遍历
void traverse(memNode * p);

//添加操作
void add(void);

//修改操作
int modify(const char * str, const char *);

//修改密码操作
int _modify_password(const char * str, const char * idx);

//修改除了密码之外其他信息操作
int _modify_information(const char *, const char *);

//二次确认密码 成功返回1 否则返回0
int seconfEntry(const char *, int);

//判断用户是否存在 存在返回true 否则返回false
bool _isExist(int);

//用于创建用户时进行密码初始化操作
void passwordInitial(int n,char * password,int len);

//删除用户操作
int del(void);

//删除节点
void _delNode(memNode* * p, memNode * pDel);

//创建用户链表
memNode* _getList(FILE * fp, int num);